from django.shortcuts import render
from rest_framework import viewsets, status
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from os import path

from .models import ChemicalProperties,\
    PhysicalProperties,\
    TensileMechanicalProperties,\
    CompressingMechanicalProperties,\
    ShearProperties,\
    BondProperties,\
    TorsionalProperties,\
    FractureToughness,\
    FrictionalWearProperties,\
    Hardness,\
    Sample,\
    MacroOrganization,\
    MicroStructure,\
    ServiceProperties

from .serializers import ChemicalPropertiesSerializer,\
    PhysicalPropertiesSerializer,\
    TensileMechanicalPropertiesSerializer,\
    CompressingMechanicalPropertiesSerializer,\
    ShearPropertiesSerializer,\
    BondPropertiesSerializer,\
    TorsionalPropertiesSerializer,\
    FractureToughnessSerializer,\
    FrictionalWearPropertiesSerializer,\
    HardnessSerializer,\
    SampleSerializer,\
    MacroOrganizationSerializer,\
    MicroStructureSerializer,\
    ServicePropertiesSerializer


class ChemicalPropertiesViewSet(viewsets.ModelViewSet):
    """
    化学性能管理视图集
    """
    queryset = ChemicalProperties.objects.all()
    serializer_class = ChemicalPropertiesSerializer

    # def retrieve(self, request, *args, **kwargs):
    #     response = super().retrieve(request, args, kwargs)
    #     self.__get_filename(response, 'polarization_curve')
    #     self.__get_filename(response, 'open_circuit_potential_curve')
    #     self.__get_filename(response, 'tg_curve')
    #     return response

    # # 将key对应文件的文件名存于response中
    # def __get_filename(self, response, key):
    #     instance = self.get_object()
    #     file = getattr(instance, key)
    #     # 若没有附件，则返回''，否则返回文件名
    #     if file == '':
    #         response.data[key + '_filename'] = ''
    #     else:
    #         response.data[key + '_filename'] = path.basename(file.name)

    def update(self, request, *args, **kwargs):
        # 编辑附件的情况：
        # 1、之前不存在附件，上传附件为新附件，直接添加
        # 2、之前不存在附件，上传附件为空，不处理
        # 3、之前已存在附件，上传附件为新附件，那么需要删除旧的附件，再添加新附件
        # 4、之前已存在附件，上传附件为空，那么需要删除旧的附件
        # 5、之前已存在附件，且未修改上传附件，这种情况已在前端处理，
        # 即不传polarization_curve和polarization_curve_empty参数
        # request.data包含polarization_curve参数说明需要上传新附件
        # request.data包含polarization_curve_empty参数说明上传附件为空
        data = request.data
        if 'polarization_curve' in data or 'polarization_curve_empty' in data:
            self.__delete_exist_file('polarization_curve')
        if 'open_circuit_potential_curve' in data or 'open_circuit_potential_curve_empty' in data:
            self.__delete_exist_file('open_circuit_potential_curve')
        if 'tg_curve' in data or 'tg_curve_empty' in data:
            self.__delete_exist_file('tg_curve')
        response = super().update(request, args, kwargs)
        return response

    def __delete_exist_file(self, key):
        instance = self.get_object()
        file = getattr(instance, key)
        if file != '':
            file.delete()


class PhysicalPropertiesViewSet(viewsets.ModelViewSet):
    """
    物理性能管理视图集
    """
    queryset = PhysicalProperties.objects.all()
    serializer_class = PhysicalPropertiesSerializer

    def update(self, request, *args, **kwargs):
        # 编辑附件的情况：
        # 1、之前不存在附件，上传附件为新附件，直接添加
        # 2、之前不存在附件，上传附件为空，不处理
        # 3、之前已存在附件，上传附件为新附件，那么需要删除旧的附件，再添加新附件
        # 4、之前已存在附件，上传附件为空，那么需要删除旧的附件
        # 5、之前已存在附件，且未修改上传附件，这种情况已在前端处理，
        # 即不传polarization_curve和polarization_curve_empty参数
        # request.data包含polarization_curve参数说明需要上传新附件
        # request.data包含polarization_curve_empty参数说明上传附件为空
        data = request.data
        if 'impedance' in data or 'impedance_empty' in data:
            self.__delete_exist_file('impedance')
        if 'impedance_curve' in data or 'impedance_curve_empty' in data:
            self.__delete_exist_file('impedance_curve')
        response = super().update(request, args, kwargs)
        return response

    def __delete_exist_file(self, key):
        instance = self.get_object()
        file = getattr(instance, key)
        if file != '':
            file.delete()


class TensileMechanicalPropertiesViewSet(viewsets.ModelViewSet):
    """
    拉伸力学性能管理视图集
    """
    queryset = TensileMechanicalProperties.objects.all()
    serializer_class = TensileMechanicalPropertiesSerializer
    def update(self, request, *args, **kwargs):
        data = request.data
        if 'engineering_stress_strain' in data or 'engineering_stress_strain_empty' in data:
            self.__delete_exist_file('engineering_stress_strain')
        if 'true_stress_strain' in data or 'true_stress_strain_empty' in data:
            self.__delete_exist_file('true_stress_strain')
        response = super().update(request, args, kwargs)
        return response

    def __delete_exist_file(self, key):
        instance = self.get_object()
        file = getattr(instance, key)
        if file != '':
            file.delete()


class CompressingMechanicalPropertiesViewSet(viewsets.ModelViewSet):
    """
    压缩力学性能管理视图集
    """
    queryset = CompressingMechanicalProperties.objects.all()
    serializer_class = CompressingMechanicalPropertiesSerializer

    def update(self, request, *args, **kwargs):
        # 编辑附件的情况：
        # 1、之前不存在附件，上传附件为新附件，直接添加
        # 2、之前不存在附件，上传附件为空，不处理
        # 3、之前已存在附件，上传附件为新附件，那么需要删除旧的附件，再添加新附件
        # 4、之前已存在附件，上传附件为空，那么需要删除旧的附件
        # 5、之前已存在附件，且未修改上传附件，这种情况已在前端处理，
        # 即不传polarization_curve和polarization_curve_empty参数
        # request.data包含polarization_curve参数说明需要上传新附件
        # request.data包含polarization_curve_empty参数说明上传附件为空
        data = request.data
        if 'compress_stress_strain' in data or 'compress_stress_strain_empty' in data:
            self.__delete_exist_file('compress_stress_strain')
        response = super().update(request, args, kwargs)
        return response

    def __delete_exist_file(self, key):
        instance = self.get_object()
        file = getattr(instance, key)
        if file != '':
            file.delete()


class ShearPropertiesViewSet(viewsets.ModelViewSet):
    """
    剪切性能管理视图集
    """
    queryset = ShearProperties.objects.all()
    serializer_class = ShearPropertiesSerializer


class BondPropertiesViewSet(viewsets.ModelViewSet):
    """
    弯曲性能管理视图集
    """
    queryset = BondProperties.objects.all()
    serializer_class = BondPropertiesSerializer


class TorsionalPropertiesViewSet(viewsets.ModelViewSet):
    """
    扭转性能管理视图集
    """
    queryset = TorsionalProperties.objects.all()
    serializer_class = TorsionalPropertiesSerializer


class FractureToughnessViewSet(viewsets.ModelViewSet):
    """
    断裂韧性管理视图集
    """
    queryset = FractureToughness.objects.all()
    serializer_class = FractureToughnessSerializer


class FrictionalWearPropertiesViewSet(viewsets.ModelViewSet):
    """
    摩擦磨损管理视图集
    """
    queryset = FrictionalWearProperties.objects.all()
    serializer_class = FrictionalWearPropertiesSerializer


class HardnessViewSet(viewsets.ModelViewSet):
    """
    硬度管理视图集
    """
    queryset = Hardness.objects.all()
    serializer_class = HardnessSerializer


class SampleViewSet(viewsets.ModelViewSet):
    """
    样本管理视图集
    """
    queryset = Sample.objects.all()
    serializer_class = SampleSerializer

    def update(self, request, *args, **kwargs):
        # 编辑附件的情况：
        # 1、之前不存在附件，上传附件为新附件，直接添加
        # 2、之前不存在附件，上传附件为空，不处理
        # 3、之前已存在附件，上传附件为新附件，那么需要删除旧的附件，再添加新附件
        # 4、之前已存在附件，上传附件为空，那么需要删除旧的附件
        # 5、之前已存在附件，且未修改上传附件，这种情况已在前端处理，
        # 即不传polarization_curve和polarization_curve_empty参数
        # request.data包含polarization_curve参数说明需要上传新附件
        # request.data包含polarization_curve_empty参数说明上传附件为空
        data = request.data
        if 'data_source_attachment' in data or 'data_source_attachment_empty' in data:
            self.__delete_exist_file('data_source_attachment')
        response = super().update(request, args, kwargs)
        return response

    def __delete_exist_file(self, key):
        instance = self.get_object()
        file = getattr(instance, key)
        if file != '':
            file.delete()


class MacroOrganizationViewSet(viewsets.ModelViewSet):
    """
    宏观形貌管理视图集
    """
    queryset = MacroOrganization.objects.all()
    serializer_class = MacroOrganizationSerializer


class MicroStructureViewSet(viewsets.ModelViewSet):
    """
    微观组织管理视图集
    """
    queryset = MicroStructure.objects.all()
    serializer_class = MicroStructureSerializer

    def update(self, request, *args, **kwargs):
        # 编辑附件的情况：
        # 1、之前不存在附件，上传附件为新附件，直接添加
        # 2、之前不存在附件，上传附件为空，不处理
        # 3、之前已存在附件，上传附件为新附件，那么需要删除旧的附件，再添加新附件
        # 4、之前已存在附件，上传附件为空，那么需要删除旧的附件
        # 5、之前已存在附件，且未修改上传附件，这种情况已在前端处理，
        # 即不传polarization_curve和polarization_curve_empty参数
        # request.data包含polarization_curve参数说明需要上传新附件
        # request.data包含polarization_curve_empty参数说明上传附件为空
        data = request.data
        if 'second_phase' in data or 'second_phase_empty' in data:
            self.__delete_exist_file('second_phase')
        if 'grain_morphology' in data or 'grain_morphology_empty' in data:
            self.__delete_exist_file('grain_morphology')
        if 'fracture_morphology' in data or 'fracture_morphology_empty' in data:
            self.__delete_exist_file('fracture_morphology')
        if 'corrosion_morphology' in data or 'corrosion_morphology_empty' in data:
            self.__delete_exist_file('corrosion_morphology')
        if 'oxidation_morphology' in data or 'oxidation_morphology_empty' in data:
            self.__delete_exist_file('oxidation_morphology')
        response = super().update(request, args, kwargs)
        return response

    def __delete_exist_file(self, key):
        instance = self.get_object()
        file = getattr(instance, key)
        if file != '':
            file.delete()


class ServicePropertiesViewSet(viewsets.ModelViewSet):
    """
    服役性能管理视图集
    """
    queryset = ServiceProperties.objects.all()
    serializer_class = ServicePropertiesSerializer
